/******************************************************************************
* Copyright (C) 2020 ShenZhen Powerdata Information Technology Co.,Ltd
* All Rights Reserved.
* 本软件为***研制。未经本公司正式书面同意，其他任何个人、团体不得使用、
* 复制、修改或发布本软件.
*****************************************************************************/

package com.xxl.job.admin.config;

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* @Title:
* @ClassName:  XxlJobProducer   
* @Description:TODO  
* @author: xgf
* @date:   2020年2月23日 上午11:18:46   
* @since   JDK1.8
* @history 2020年2月23日 TODO 新建
*/
public class XxlJobProducer {
	@Autowired
	XxlJobClientConfig xxlJobClientConfig;
	
	
	
    private DefaultMQProducer producer;
    
    private XxlJobProducer(){
       
    }
    
    
    
    public XxlJobProducer(XxlJobClientConfig rocketMqConfig) {
		this.xxlJobClientConfig = rocketMqConfig;
		 //示例生产者
        producer = new DefaultMQProducer(rocketMqConfig.getProducerGroup());
        //不开启vip通道 开通口端口会减2
        //producer.setVipChannelEnabled(false);
        //绑定name server
        producer.setNamesrvAddr(rocketMqConfig.getNamesrv());
        start();
	}



	public static XxlJobProducer getInstance(){
        return EnumHolder.INSTANCE.getSingleton();
    }
    
    
    //使用枚举充当holder
    private enum EnumHolder{
        
        INSTANCE;
        private XxlJobProducer instance;
        EnumHolder(){
            this.instance = new XxlJobProducer();
        }
        private XxlJobProducer getSingleton(){
            return instance;
        }
    }
    /**
     * 对象在使用之前必须要调用一次，只能初始化一次
     */
    public void start(){
        try {
            this.producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }
  
    public DefaultMQProducer getProducer(){
        return this.producer;
    }
    /**
     * 一般在应用上下文，使用上下文监听器，进行关闭
     */
    public void shutdown(){
        this.producer.shutdown();
    }
}
